# https://macromates.com/manual/en/language_grammars
# https://macromates.com/manual/en/regular_expressions
# https://www.sublimetext.com/docs/3/scope_naming.html

# Coloring
# https://code.visualstudio.com/docs/getstarted/themes
# https://code.visualstudio.com/api/extension-guides/color-theme#syntax-colors
# https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide
# https://code.visualstudio.com/docs/cpp/colorization-cpp

$schema: https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json
name: LLVM IR
scopeName: source.llvm
patterns:
  - match: "\\bvoid\\b|\
            \\bhalf\\b|\
            \\bbfloat\\b|\
            \\bfloat\\b|\
            \\bdouble\\b|\
            \\bx86_fp80\\b|\
            \\bfp128\\b|\
            \\bppc_fp128\\b|\
            \\blabel\\b|\
            \\bmetadata\\b|\
            \\bx86_mmx\\b|\
            \\bx86_amx\\b|\
            \\btype\\b|\
            \\blabel\\b|\
            \\bopaque\\b|\
            \\btoken\\b|\
            \\bi\\d+\\**"
    name: storage.type.llvm
  - match: "!([a-zA-Z]+)\\s*\\("
    captures:
      1:
        name: storage.type.llvm
  - match: "\\badd\\b|\
            \\baddrspacecast\\b|\
            \\balloca\\b|\
            \\band\\b|\
            \\barcp\\b|\
            \\bashr\\b|\
            \\batomicrmw\\b|\
            \\bbitcast\\b|\
            \\bbr\\b|\
            \\bcatchpad\\b|\
            \\bcatchswitch\\b|\
            \\bcatchret\\b|\
            \\bcall\\b|\
            \\bcallbr\\b|\
            \\bcleanuppad\\b|\
            \\bcleanupret\\b|\
            \\bcmpxchg\\b|\
            \\beq\\b|\
            \\bexact\\b|\
            \\bextractelement\\b|\
            \\bextractvalue\\b|\
            \\bfadd\\b|\
            \\bfast\\b|\
            \\bfcmp\\b|\
            \\bfdiv\\b|\
            \\bfence\\b|\
            \\bfmul\\b|\
            \\bfpext\\b|\
            \\bfptosi\\b|\
            \\bfptoui\\b|\
            \\bfptrunc\\b|\
            \\bfree\\b|\
            \\bfrem\\b|\
            \\bfreeze\\b|\
            \\bfsub\\b|\
            \\bfneg\\b|\
            \\bgetelementptr\\b|\
            \\bicmp\\b|\
            \\binbounds\\b|\
            \\bindirectbr\\b|\
            \\binsertelement\\b|\
            \\binsertvalue\\b|\
            \\binttoptr\\b|\
            \\binvoke\\b|\
            \\blandingpad\\b|\
            \\bload\\b|\
            \\blshr\\b|\
            \\bmalloc\\b|\
            \\bmax\\b|\
            \\bmin\\b|\
            \\bmul\\b|\
            \\bnand\\b|\
            \\bne\\b|\
            \\bninf\\b|\
            \\bnnan\\b|\
            \\bnsw\\b|\
            \\bnsz\\b|\
            \\bnuw\\b|\
            \\boeq\\b|\
            \\boge\\b|\
            \\bogt\\b|\
            \\bole\\b|\
            \\bolt\\b|\
            \\bone\\b|\
            \\bor\\b|\
            \\bord\\b|\
            \\bphi\\b|\
            \\bptrtoint\\b|\
            \\bresume\\b|\
            \\bret\\b|\
            \\bsdiv\\b|\
            \\bselect\\b|\
            \\bsext\\b|\
            \\bsge\\b|\
            \\bsgt\\b|\
            \\bshl\\b|\
            \\bshufflevector\\b|\
            \\bsitofp\\b|\
            \\bsle\\b|\
            \\bslt\\b|\
            \\bsrem\\b|\
            \\bstore\\b|\
            \\bsub\\b|\
            \\bswitch\\b|\
            \\btrunc\\b|\
            \\budiv\\b|\
            \\bueq\\b|\
            \\buge\\b|\
            \\bugt\\b|\
            \\buitofp\\b|\
            \\bule\\b|\
            \\bult\\b|\
            \\bumax\\b|\
            \\bumin\\b|\
            \\bune\\b|\
            \\buno\\b|\
            \\bunreachable\\b|\
            \\bunwind\\b|\
            \\burem\\b|\
            \\bva_arg\\b|\
            \\bxchg\\b|\
            \\bxor\\b|\
            \\bzext\\b"
    name: keyword.instruction.llvm
  - match: "\\bacq_rel\\b|\
            \\bacquire\\b|\
            \\baddrspace\\b|\
            \\balias\\b|\
            \\balign\\b|\
            \\balignstack\\b|\
            \\ballocsize\\b|\
            \\balwaysinline\\b|\
            \\bappending\\b|\
            \\bargmemonly\\b|\
            \\barm_aapcs_vfpcc\\b|\
            \\barm_aapcscc\\b|\
            \\barm_apcscc\\b|\
            \\basm\\b|\
            \\batomic\\b|\
            \\bavailable_externally\\b|\
            \\bblockaddress\\b|\
            \\bbuiltin\\b|\
            \\bbyref\\b|\
            \\bbyval\\b|\
            \\bc\\b|\
            \\bcaller\\b|\
            \\bcatch\\b|\
            \\bcc\\b|\
            \\bccc\\b|\
            \\bcleanup\\b|\
            \\bcold\\b|\
            \\bcoldcc\\b|\
            \\bcomdat\\b|\
            \\bcommon\\b|\
            \\bconstant\\b|\
            \\bconvergent\\b|\
            \\bdatalayout\\b|\
            \\bdeclare\\b|\
            \\bdefault\\b|\
            \\bdefine\\b|\
            \\bdeplibs\\b|\
            \\bdereferenceable\\b|\
            \\bdereferenceable_or_null\\b|\
            \\bdistinct\\b|\
            \\bdllexport\\b|\
            \\bdllimport\\b|\
            \\bdso_local\\b|\
            \\bdso_preemptable\\b|\
            \\bexcept\\b|\
            \\bextern_weak\\b|\
            \\bexternal\\b|\
            \\bexternally_initialized\\b|\
            \\bfastcc\\b|\
            \\bfilter\\b|\
            \\bfrom\\b|\
            \\bgc\\b|\
            \\bglobal\\b|\
            \\bhhvm_ccc\\b|\
            \\bhhvmcc\\b|\
            \\bhidden\\b|\
            \\bhot\\b|\
            \\bimmarg\\b|\
            \\binaccessiblemem_or_argmemonly\\b|\
            \\binaccessiblememonly\\b|\
            \\binalloc\\b|\
            \\binitialexec\\b|\
            \\binlinehint\\b|\
            \\binreg\\b|\
            \\bintel_ocl_bicc\\b|\
            \\binteldialect\\b|\
            \\binternal\\b|\
            \\bjumptable\\b|\
            \\blinkonce\\b|\
            \\blinkonce_odr\\b|\
            \\blocal_unnamed_addr\\b|\
            \\blocaldynamic\\b|\
            \\blocalexec\\b|\
            \\bminsize\\b|\
            \\bmodule\\b|\
            \\bmonotonic\\b|\
            \\bmsp430_intrcc\\b|\
            \\bmustprogress\\b|\
            \\bmusttail\\b|\
            \\bnaked\\b|\
            \\bnest\\b|\
            \\bnoalias\\b|\
            \\bnobuiltin\\b|\
            \\bnocallback\\b|\
            \\bnocapture\\b|\
            \\bnocf_check\\b|\
            \\bnoduplicate\\b|\
            \\bnofree\\b|\
            \\bnoimplicitfloat\\b|\
            \\bnoinline\\b|\
            \\bnomerge\\b|\
            \\bnonlazybind\\b|\
            \\bnonnull\\b|\
            \\bnoprofile\\b|\
            \\bnorecurse\\b|\
            \\bnoredzone\\b|\
            \\bnoreturn\\b|\
            \\bnosync\\b|\
            \\bnoundef\\b|\
            \\bnounwind\\b|\
            \\bnosanitize_bounds\\b|\
            \\bnosanitize_coverage\\b|\
            \\bnull_pointer_is_valid\\b|\
            \\boptforfuzzing\\b|\
            \\boptnone\\b|\
            \\boptsize\\b|\
            \\bpersonality\\b|\
            \\bpreallocated\\b|\
            \\bprivate\\b|\
            \\bprotected\\b|\
            \\bptx_device\\b|\
            \\bptx_kernel\\b|\
            \\breadnone\\b|\
            \\breadonly\\b|\
            \\brelease\\b|\
            \\breturned\\b|\
            \\breturns_twice\\b|\
            \\bsafestack\\b|\
            \\bsanitize_address\\b|\
            \\bsanitize_hwaddress\\b|\
            \\bsanitize_memory\\b|\
            \\bsanitize_memtag\\b|\
            \\bsanitize_thread\\b|\
            \\bsection\\b|\
            \\bseq_cst\\b|\
            \\bshadowcallstack\\b|\
            \\bsideeffect\\b|\
            \\bsignext\\b|\
            \\bsource_filename\\b|\
            \\bspeculatable\\b|\
            \\bspeculative_load_hardening\\b|\
            \\bspir_func\\b|\
            \\bspir_kernel\\b|\
            \\bsret\\b|\
            \\bssp\\b|\
            \\bsspreq\\b|\
            \\bsspstrong\\b|\
            \\bstrictfp\\b|\
            \\bswiftcc\\b|\
            \\bswifterror\\b|\
            \\bswiftself\\b|\
            \\bsyncscope\\b|\
            \\btail\\b|\
            \\btailcc\\b|\
            \\btarget\\b|\
            \\bthread_local\\b|\
            \\bto\\b|\
            \\btriple\\b|\
            \\bunnamed_addr\\b|\
            \\bunordered\\b|\
            \\buselistorder\\b|\
            \\buselistorder_bb\\b|\
            \\buwtable\\b|\
            \\bvolatile\\b|\
            \\bweak\\b|\
            \\bweak_odr\\b|\
            \\bwillreturn\\b|\
            \\bwin64cc\\b|\
            \\bwithin\\b|\
            \\bwriteonly\\b|\
            \\bx86_64_sysvcc\\b|\
            \\bx86_fastcallcc\\b|\
            \\bx86_stdcallcc\\b|\
            \\bx86_thiscallcc\\b|\
            \\bzeroext\\b"
    name: storage.modifier.llvm
  - match: "@[-a-zA-Z$._][-a-zA-Z$._0-9]*"
    name: entity.name.function.llvm
  - match: "[%@!]\\d+\\b"
    name: variable.llvm
  - match: "%[-a-zA-Z$._][-a-zA-Z$._0-9]*"
    name: variable.llvm
  - match: "(![-a-zA-Z$._][-a-zA-Z$._0-9]*)\\s*$"
    captures:
      1:
        name: variable.llvm
  - match: "(![-a-zA-Z$._][-a-zA-Z$._0-9]*)\\s*[=!]"
    captures:
      1:
        name: variable.llvm
  - begin: "\""
    end: "\""
    patterns:
      - name: "constant.character.escape.untitled"
        match: "\\."
    name: string.quoted.double.llvm
  - match: "[-a-zA-Z$._][-a-zA-Z$._0-9]*:"
    name: entity.name.label.llvm
  - match: "-?\\b\\d+\\.\\d*(e[+-]\\d+)?\\b"
    name: constant.numeric.float
  - match: "\\b0x\\x+\\b"
    name: constant.numeric.float
  - match: "-?\\b\\d+\\b"
    name: constant.numeric.integer
  - match: "\\btrue\\b|\
            \\bfalse\\b|\
            \\bnull\\b|\
            \\bzeroinitializer\\b|\
            \\bundef\\b|\
            \\bpoison\\b|\
            \\bnull\\b|\
            \\bnone\\b"
    name: constant.language
  - match: "\\bDW_TAG_[a-z_]+\\b|\
            \\bDW_ATE_[a-zA-Z_]+\\b|\
            \\bDW_OP_[a-zA-Z0-9_]+\\b|\
            \\bDW_LANG_[a-zA-Z0-9_]+\\b|\
            \\bDW_VIRTUALITY_[a-z_]+\\b|\
            \\bDIFlag[A-Za-z]+\\b"
    name: constant.other
  - match: ";\\s*PR\\d*\\s*$"
    name: string.regexp
  - match: ";\\s*REQUIRES:.*$"
    name: string.regexp
  - match: ";\\s*RUN:.*$"
    name: string.regexp
  - match: ";\\s*ALLOW_RETRIES:.*$"
    name: string.regexp
  - match: ";\\s*CHECK:.*$"
    name: string.regexp
  - match: ";\\s*CHECK-(NEXT|NOT|DAG|SAME|LABEL):.*$"
    name: string.regexp
  - match: ";\\s*XFAIL:.*$"
    name: string.regexp
  - match: ;.*$
    name: comment.line.llvm
